home *** CD-ROM | disk | FTP | other *** search
/ Nebula 2 / Nebula Two.iso / SourceCode / GameKit / gamekit-1 / PlayerUpView.m < prev    next >
Text File  |  1995-06-12  |  4KB  |  156 lines

  1.  
  2. // PlayerUpView.m - see header file for more info
  3.  
  4. #import <gamekit/gamekit.h>    // Header file
  5.  
  6. @implementation PlayerUpView
  7.  
  8. - initFrame:(const NXRect *)frm   // designated initializer for a view
  9. {
  10.     [super initFrame:frm];
  11.     margin = 2.0; // "margin" around the player image
  12.     numUp = 0; // start with zero; up to game to set properly at start
  13.     return self;
  14. }
  15.  
  16. - setImage:anImage { image = anImage; return self; }
  17. - (int)numUp { return numUp; }
  18. - setMargin:(NXCoord)newMargin { margin = newMargin; return self; }
  19.  
  20. - setImageFrame:(NXRect *)aRect
  21. {
  22.     NXSetRect(&imageFrame, NX_X(aRect), NX_Y(aRect),
  23.             NX_WIDTH(aRect), NX_HEIGHT(aRect));
  24.     return self;
  25. }
  26.  
  27. - incNumUp:sender
  28. {
  29.     numUp++; [self update];
  30. #ifdef NOISYDEBUG
  31.         fprintf(stderr, "Inc number of one ups to %d.\n", numUp);
  32. #endif
  33.     if ([delegate respondsTo:@selector(oneUpAdded)])
  34.         [delegate oneUpAdded];
  35.     return self;
  36. }
  37.  
  38. - setNumUp:(int)newNumUp
  39. {
  40.     if (numUp == newNumUp) return self; // no change so leave.
  41.     numUp = newNumUp;
  42. #ifdef NOISYDEBUG
  43.         fprintf(stderr, "Set number of one ups to %d.\n", numUp);
  44. #endif
  45.     // this message usually comes at start of game, so assume
  46.     // that we should reset the extra man bonus points...
  47.     [extraManBonusTracker resetBonus];
  48.     return [self update];
  49. }
  50.  
  51. - (BOOL)decNumUp:sender // returns NO if player has no xtra men left.
  52. {
  53.     if (numUp) {
  54.         numUp--; [self update];
  55. #ifdef NOISYDEBUG
  56.         fprintf(stderr, "Dec number of one ups to %d.\n", numUp);
  57. #endif
  58.         if ([delegate respondsTo:@selector(oneUpUsed)])
  59.             [delegate oneUpUsed];
  60.         return YES;
  61.     }
  62.     if ([delegate respondsTo:@selector(allOneUpsGone)])
  63.         [delegate allOneUpsGone];
  64.     return NO;
  65. }
  66.  
  67. - drawSelf:(NXRect *)rects :(int)rectCount    // redraws the view.
  68. {    // this is inefficient; I always redraw the entire view...
  69.     // Since this View is redrawn so little, I don't care-it's good enough.
  70.     int baseCount = numUp; // counts down to zero to fill view
  71.     int x, y;
  72.     NXPoint pos; // where we'll splat the base in the view
  73.     
  74.     PSsetgray(NX_LTGRAY); // opaque background
  75.     NXRectFill(&bounds);
  76.     if (baseCount > 0) {
  77.         // start at bottom row; move up
  78.         y = 0; pos.y = (imageFrame.size.height + margin * 2) * y + margin;
  79.         while ((pos.y < bounds.size.height) && baseCount) { // y loop
  80.             // start at left, move right
  81.             x = 0; pos.x = (imageFrame.size.width + margin * 2) * x + margin;
  82.             while ((pos.x < bounds.size.width) && baseCount) { // x loop
  83.                 // splat the base on the screen
  84.                 [image composite:NX_SOVER fromRect:&imageFrame toPoint:&pos];
  85.                 baseCount--; // update vars
  86.                 x++; pos.x = (imageFrame.size.width + margin * 2) * x + margin;
  87.             }
  88.             y++; pos.y = (imageFrame.size.height + margin * 2) * y + margin;
  89.     }    }
  90.     return self;
  91. }
  92.  
  93. - read:(NXTypedStream *)stream
  94. {
  95.     [super read:stream];
  96.     NXReadTypes(stream, "if", &numUp, &margin);
  97.     NXReadRect(stream, &imageFrame);
  98.     image = NXReadObject(stream);
  99.     return self;
  100. }
  101.  
  102. - write:(NXTypedStream *)stream // you must call NXWriteRootObject to
  103. { // invoke this method
  104.     [super write:stream];
  105.     NXWriteTypes(stream, "if", &numUp, &margin);
  106.     NXWriteRect(stream, &imageFrame);
  107.     NXWriteObjectReference(stream, image);
  108.     return self;
  109. }
  110.  
  111. - scoreChangedFrom:(int)oldScore to:(int)newScore
  112. {
  113.     // use a bonus tracker to give out extra guys...we need to be the score
  114.     // keeper's delegate for this to work!  (GameBrain will do that for us)
  115. #ifdef NOISYDEBUG
  116.     fprintf(stderr, "Score change from %d to %d, xtra man at %d.  ",
  117.             oldScore, newScore, [extraManBonusTracker bonusValue]);
  118. #endif
  119.     if (!extraManBonusTracker) return self; // no bonuses given...
  120.     if (([extraManBonusTracker bonusValue] >= oldScore) &&
  121.             ([extraManBonusTracker bonusValue] <= newScore)) { // crossed it!
  122.         [extraManBonusTracker advanceBonus];
  123.         [self incNumUp:self];
  124.         if ([delegate respondsTo:@selector(oneUpAwarded)])
  125.             [delegate oneUpAwarded];
  126. #ifdef NOISYDEBUG
  127.         fprintf(stderr, "Bonus awarded.");
  128. #endif
  129.     }
  130. #ifdef NOISYDEBUG
  131.     fprintf(stderr, "\n");
  132. #endif
  133.     return self;
  134. }
  135.  
  136. - setExtraManBonusTracker:tracker
  137. {
  138.     id oldExtraManBonusTracker = extraManBonusTracker;
  139.     if ([tracker isKindOf:[BonusTracker class]]) { // make sure right class
  140.         extraManBonusTracker = tracker;
  141.         return oldExtraManBonusTracker;
  142.     }
  143.     return nil;
  144. }
  145.  
  146. - extraManBonusTracker { return extraManBonusTracker; }
  147. - delegate { return delegate; }
  148. - setDelegate:anObject
  149. {
  150.     id oldDelegate = delegate;
  151.     delegate = anObject;
  152.     return oldDelegate;
  153. }
  154.  
  155. @end
  156.